function [data] = backpropagation( vectorWeights, deltaWeights, backPropData, pattern )    
% BACKPROPAGATION
%   Esta funcion se ocupa del backpropagation para obtener el vector de
%   deltas, uno por cada capa y posteriormente con ese vector actualizar
%   los pesos de la red, los cuales devuelve en su nombre
%
%   Input:
%       vectorWeights: vector actual con las matrices de pesos
%       deltaWeights: vector con las actualizaciones de los pesos en la
%       iteracion anterior, se utiliza para el momentum
%       pattern: Patron actual
%       backPropData: Estructura que contiene la informacion necesario para
%       el backpropagation obtenida en el feedForward, como el delta de la
%       neurona de salida ylos vectores h de cada capa
%
%   Output:
%       vectorWeights: vector con las matrices de pesos actualizadas
%       deltaWeights: Vector con las actualizaciones de pesos de esta
%       iteracion

    global LAYERS ETA ALPHA DELTA;
    
    deltasVector = cell(1,length(vectorWeights));
    deltasVector{length(LAYERS)} = backPropData{2};
    data = cell(1,2);
    
    for i = length(deltasVector)-1:-1:1
        deltasVector{i} = (gp_function(backPropData{1}{i},i) + DELTA).*(vectorWeights{i+1}(:,2:length(vectorWeights{i+1}(1,:)))'*deltasVector{i+1});
    end
    
    deltaWeights{1} = ALPHA*deltaWeights{1} + ETA*deltasVector{1}*(vertcat(-1,pattern)');
    vectorWeights{1} = vectorWeights{1} + deltaWeights{1};
    for j = 2:length(vectorWeights)
        deltaWeights{j} = ALPHA*deltaWeights{j} + ETA*deltasVector{j}*(vertcat(-1,g_function(backPropData{1}{j-1}, j))');
        vectorWeights{j} = vectorWeights{j} + deltaWeights{j};
    end

    data{1} = vectorWeights;
    data{2} = deltaWeights;
end

